class S:
    """
    function: 在目录下搜索指定文件，使用这个指定的文件来做特定的功能。
              具体功能有： 可以搜索文件是否存在、文件是否包含指定内容、通过指定内容搜索文件、指定文件搜索类似的文件。
    issues: 1. 搜索完要么标准输出，要么输出到文件中或网络发送。（三部分：输入，处理，输出）
            2. 需要一个主体，能把后续添加的功能包含在内。
            3. 搜索一些库文件（如，/usr/include)，分析一些头文件调用的次数（分析哪些头文件使用频率高）；或者一个文件使用了哪些头文件他们的关系能否用图形展示出来。
            4. 某个源代码目录中包含哪些不同的文件，每种文件有多少个数量。（S2已实现）
    """
    import os,re

    def __init__(self, dargs):
        self.dargs = self.arg_convert(dargs)
        pass

    def main(self):
        # s = '/root/Downloads/glibc2.27-src'         # c库源代码。
        # s = '/usr/include'                        # c核心库。
        # s = '/root/Downloads/python3.6-src'       # c语言实现python源代码。
        s = '/usr/lib/python2.7'

        paths = self.getdirs(s)
        # print(paths)
        for p in paths:
            temp = self.combine(s, p)
            # print(temp)
            if self.os.path.isdir(temp):
                # print('main dir')
                self.dir(temp)
            elif self.os.path.isfile(temp):
                # print('main file')
                self.file(temp)
        pass

    def arg_convert(self, largs):
        """
        function: 把参数列表转换成一个字典。-f任何减号字母后面跟着的都是这个指令的参数。
                  如：-f 123，123是f指令的参数。
        :param largs: 命令行参数列表。
        :return: 参数字典。
        """
        largs = largs[1:]
        dargs = {}
        for l in range(len(largs)):
            if l < len(largs) - 1 and l % 2 == 0:   # 索引不超过最大长度前一位，并且索引单数执行。
                if ',' in largs[l + 1]:             # 包含逗号就是有多个参数需要拆分成一个列表。
                    t = largs[l + 1].split(',')     # 以逗号分隔参数。
                    tt = [x for x in t if not x == '']  # 将列表中不为空的内容组成一个新列表。
                    dargs[largs[l]] = tt
                else:
                    dargs[largs[l]] = largs[l + 1]
                pass
        return dargs

    def combine(self, path, sub):
        return path + '/' + sub

    def getdirs(self, path):
        if S.os.path.isdir(path):
            return S.os.listdir(path)
        elif S.os.path.isfile(path):
            return path
        pass

    def dir(self, path):
        # print('dir')
        paths = self.getdirs(path)
        if isinstance(paths, list):
            # print('is')
            # print(paths)
            for p in paths:
                # print(p)
                temp = self.combine(path, p)
                # print(temp)
                if S.os.path.isdir(temp):
                    # print('dir in dir')
                    self.dir(temp)
                elif S.os.path.isfile(temp):
                    # print('file in dir')
                    self.file(temp)
        elif S.os.path.isfile(paths):
            self.file(path)

    def file(self, path):
        s = 'print'    # 查找指定内容。
        i = 0
        numbers = 0     # 行数。
        lines = 1       # 显示搜索指定内容行后几行。
        try:  # 遇到iso-8859会报错。
            for f in open(path):
                m = S.re.match(s, f)
                # if s in f or i > 0:
                if m or i > 0:          # 使用正则表达式进行判断。
                    i = lines if i == 0 else i
                    i -= 1
                    numbers += 1
                    print(numbers, " : ", i, " : ", f)
            if numbers > 0:
                print("-" * 30)
                print("file : ", path)
        except:
            # print("*" * 30)
            # print(path)
            pass
        pass

    def dotname(self):
        print(self.dargs['-d'])
        if '.py' == self.dargs['-d']:
            print(1)
        pass

    def getFileEnding(self, path):
        ending = path.split('.')
        ending = ending[len(ending) - 1]
        return ending

    def checktext(self):
        pass

    pass


class S2(S):
    """
    function: 对S功能的修改，但不直接修改S代码。
    """
    count = 0

    def __init__(self, dargs):
        self.files = dict()

    def file(self, path):
        """
        function: 统计目录下不同文件的个数。
        :param path: 目录和文件名。
        :return:
        """
        ending = self.getFileEnding(path)
        t = self.files.get(ending)
        if t:
            self.files[ending] = t + 1
        else:
            self.files[ending] = 1

    pass


class S3(S):
    import re

    def file(self, path):
        """
        function: 搜索文件名包含特定词的文件，并打印此文件。
        :param path: 目录和文件名。
        :return:
        """
        filename = '.'  # 文件包含的指定词。
        switch = 0
        words = '# Grammar'

        if filename in path:
            try:
                for ff in open(path):
                    # r = S3.re.S(words, ff.lstrip())
                    # if r:
                    #     print(ff)
                    if words in ff:
                        switch = 1
                        print(ff)
            except:
                pass
            if switch > 0:
                print('-' * 30)
                print('-' * 30)
                print('file : ', path)
        pass
    pass


class S4(S):
    """
    function: 统计每个py文件，有路径；包含的类，方法；导入包。最终统计出一个项目中每个py文件之间的关联性。通过图形的方式展示出来。
    """
    def __init__(self):
        self.data = []

    def statistics_package(self, path):
        """
        function: 统计每个文件导入了哪些包。
        :param path:
        :return:
        """
        save_text = []

        if '.py' in path:
            save_text.append(path)
            for f in open(path):
                if 'import ' in f:
                    f = f.replace('\n', '')
                    i = f.find('import') + len('import')
                    save_text.append(f[i + 1:])
                    # save_text.append(f.replace('\n', ''))
            print(save_text)
        pass

    def statistics_class(self, path):
        if '.py' in path:
            print(path)
        # for f in open(path):
        #     print(f)
        pass

    def statistics_func(self, path):
        name = '.py'
        if name in path:
            data = list()
            data.append(path)
            for f in open(path):
                if 'def ' in f and '(' in f:
                    ss = f[f.find('def') + 3: f.find('(')].lstrip()
                    data.append(ss)
                    # print(ss)
                pass
            if len(data) > 1:
                print(data, ", ", len(data))
        pass

    def file(self, path):
        self.statistics_package(path)
        pass
    pass


if __name__ == '__main__':
    import os, sys
    # args = sys.argv
    args = ['sdfs', '-a','.py','-d', 'a,f,sf,,']
    s = S3(args)
    s.main()
    # f = zip(s.files.values(), s.files.keys())
    # f = sorted(f, reverse=True)
    # print(f)